#include "app_nbiot.h"
#include "usart.h"
#include "systick.h"

int udp_socket;

/* 描述：NBIoT启动函数，在NBIoT启动后，我们需要等待其驻网，然后查询IP
		 得到IP后，申请一个UDPsocket
 * 参数：无
 * 返回值：0表示启动成功，-1表示启动失败 */
int NB_Start(void)
{
	char res_buf[256];
	int cnt = 0, t = 0;
	/* 查询是否驻网，查询15次*/
	for(cnt = 0 ; cnt < 15; cnt++)
	{
		u1_printf("AT+CGATT?\r\n");
		for(t = 0; t < 1000; t++)
		{
			if(USART1_RX_NUM > 0) break;
			delay_1ms(1);
		}
		if(USART1_RX_NUM > 0)
		{
			USART1_RX_NUM = 0;
			if(Find_string((char *)rx1_date_buf,"+CGATT:","\r\nOK\r\n",res_buf)>0)
				if(res_buf[0] == '1') break;
		}
		delay_1ms(2000);
	}
	if(cnt == 15) return -1;
	
	/* 查询IP地址，查询15次*/
	for(cnt = 0 ; cnt < 15; cnt++)
	{
		u1_printf("AT+CGPADDR\r\n");
		for(t = 0; t < 1000; t++)
		{
			if(USART1_RX_NUM > 0) break;
			delay_1ms(1);
		}
		if(USART1_RX_NUM > 0)
		{
			USART1_RX_NUM = 0;
			if(Find_string((char *)rx1_date_buf,"+CGPADDR:0,","\r\nOK",res_buf)>0)
			{
				printf("\r\nNBIoT IP addr: %s\r\n",res_buf);
				break;
			}
		}
		delay_1ms(1000);
	}
	if(cnt == 15) return -1;
	
	/* 申请一个UDPsocket*/
	for(cnt = 0 ; cnt < 15; cnt++)
	{
		u1_printf("AT+NSOCR=DGRAM,17,0\r\n");
		for(t = 0; t < 1000; t++)
		{
			if(USART1_RX_NUM > 0) break;
			delay_1ms(1);
		}
		if(USART1_RX_NUM > 0)
		{
			USART1_RX_NUM = 0;
			if(Find_string((char *)rx1_date_buf,"\r\n","\r\nOK",res_buf)>0)
			{
				udp_socket = res_buf[0] - '0';
				printf("\r\nudp_socket: %d\r\n",udp_socket);
				break;
			}	
		}
		delay_1ms(1000);
	}
	if(cnt == 15) return -1;
	return 0;
}

/* 描述：将字符转换为16进制格式
 * 参数 *str：需要转换的字符串
 * 参数 *hex：转换后的16进制格式
 * 返回值：无					*/
void str2hex(char* str, char* hex)
{
    const char* cHex = "0123456789abcdef";
    int i=0;
    for(int j =0; str[j] != '\0'; j++)
    {
        unsigned int a =  (unsigned int) str[j];
        hex[i++] = cHex[(a & 0xf0) >> 4];
        hex[i++] = cHex[(a & 0x0f)];
    }
    hex[i] = '\0';
}


/* 描述：NBIoT模拟CoAP上报数据
 * 参数 *ipaddr ：服务器的IP地址字符串
 * 参数 *topic  ：EMQ转换成MQTT协议后的主题,不能大于15个字符长度
 * 参数 *payload：有效负载，即我们真正想要上传的数据
 * 返回值：无
 */
void NB_Send_data(char * ipaddr, char * topic, char * payload)
{
	static uint16_t msg_id = 100;
	static char udp_data[256];
	static char palyload_hex[256];
	static char topic_hex[256];
	msg_id++;
	str2hex(topic,topic_hex);
	str2hex(payload,palyload_hex);
	sprintf(udp_data,"4203%04x5562b46d7174740%01x%s49633d636c69656e743105753d746f6d08703d736563726574ff%s",
						msg_id,strlen(topic)%16,topic_hex,palyload_hex);
	u1_printf("AT+NSOST=%d,%s,5683,%d,%s\r\n",udp_socket,ipaddr,strlen(udp_data)/2,udp_data);
}


/* 描述：寻找特定字符串
 * 参数 *pcBuf：需要进行操作的字符串
 * 参数 *left ：需要搜索的字符串的左边的标识符
 * 参数 *right: 需要搜索的字符串的右边的标识符
 * 参数 *pcRes：输出参数，寻找到的字符串
 * 返回值：返回寻找到的字符串长度，0表示失败   */
int Find_string(char *pcBuf,char *left,char *right, char *pcRes)
{
	int str_len = 0;
    char *pcBegin = NULL;
    char *pcEnd = NULL;
    pcBegin = strstr(pcBuf, left);					/* 找到左侧数据 */
    pcEnd = strstr(pcBegin+strlen(left), right);	/* 找到右侧数据 */
    if(pcBegin == NULL || pcEnd == NULL || pcBegin > pcEnd)
    {
        printf("string name not found!-> %s\n",pcBuf);
        return 0;
    }
    else
    {
        pcBegin += strlen(left);
		str_len = pcEnd-pcBegin;
        memcpy(pcRes, pcBegin, str_len);
		pcRes[str_len] = '\0';
        return str_len;
    }
}

